package java行为型设计模式.模板方法模式;

/**
 * 在模板模式中，父抽象类公开几个抽象方法供子类实现。
 * 在父抽象类中有另一个方法或几个方法使用抽象方法来实现业务逻辑。
 *
 * 抽象方法通常用于父类所需的每个步骤。
 *
 * 例如，为了使用新的软件，我们需要下载，安装，配置和运行。如果我们要使用模板模式来编码逻辑，
 * 我们将创建一个父类如下。
 */
abstract class UseSoftware{
    abstract void download();
    abstract void install();
    abstract void configuration();
    abstract void run();

    public void useNewSoftware(){
        download();
        install();
        configuration();
        run();
    }
}

/**
 * 对于使用不同的软件，我们只需要从上面的抽象类继承并提供详细的实现。
 *
 * 模板模式是一种行为模式。
 */
public class Main {
    public static void main(String[] args) {
        Software s1 = new Browser();
        s1.play();
        s1 = new Editor();
        s1.play();
    }
}
abstract class Software{
    abstract void initialize();
    abstract void start();
    abstract void end();
    public final void play(){
        initialize();
        start();
        end();
    }
}
class Browser extends Software{
    @Override
    void initialize() {
        System.out.println("Browser initialize");
    }

    @Override
    void start() {
        System.out.println("Browser Started.");
    }

    @Override
    void end() {
        System.out.println("Browser Finished!");
    }
}
class Editor extends Software {

    @Override
    void end() {
        System.out.println("Editor Finished!");
    }

    @Override
    void initialize() {
        System.out.println("Editor Initialized!");
    }

    @Override
    void start() {
        System.out.println("Editor Started!");
    }
}